package com.service;


import com.dao.DepDAO;
import com.dao.EmpDAO;
import com.pojo.Dep;
import com.pojo.Emp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

@Service
@Transactional
public class EmpService {

    @Autowired
    private EmpDAO  empDAO;

    @Autowired
    private DepDAO  depDAO;

    /**
     * 新增员工  员工主动加部门
     * @param empName  员工姓名
     * @param depId    部门编号
     * @return
     */
    public Emp addEmp1(String empName, int depId)
    {
        Emp emp = new Emp();
        emp.setEmpName(empName);

        Dep dep = depDAO.findById(depId).get();//根据部门ID找部门对象
        emp.setDep(dep);

        return  empDAO.save(emp);

    }


    /**
     * 新增员工   部门主动加员工
     * @param empName  员工姓名
     * @param depId    部门编号
     * @return
     */
    public Emp addEmp2(String empName, int depId)
    {
        Emp emp = new Emp();
        emp.setEmpName(empName);

        Dep dep = depDAO.findById(depId).get();//根据部门ID找部门对象
        //emp.setDep(dep);
        dep.getEmps().add(emp); //部门主动,这个性能要低一些


        return  empDAO.save(emp);

    }

    /**
     * 级联新增（新增一个部门（主表）和多个员工（子表）
     *    1. 代码
     *    2. 注解(主表上面@OneToMany)
     */
    public void addDepAndEmp()
    {
        //1.实例化主表
        Dep dep = new Dep();
        dep.setDepName("廉政公署");

        //2.实例化子表
        Emp emp1 = new Emp();
        emp1.setEmpName("周义翔");

        Emp emp2  = new Emp();
        emp2.setEmpName("马凯雷");

        //3.主表添加到子表到集合
        dep.getEmps().add(emp1);
        dep.getEmps().add(emp2);


        //4.保存主表
        depDAO.save(dep);


    }

    /**
     * 查部门有哪些员工
     * @param depId
     */
    public void printEmpByDep(int depId)
    {
        //lazy
        Dep dep = depDAO.findById(depId).get();
        List<Emp> list = dep.getEmps();
        for (Emp emp : list) {
            System.out.println(emp.getEmpId()+"\t"+emp.getEmpName());
        }
    }

    /**
     * 查部门有哪些员工
     * @param depId
     */
    public void printEmpByDep2(int depId)
    {

        List<Emp> list = empDAO.getAllEmpWithDepByDep(depId);
        list.stream().forEach(System.out::println);
    }

    /**
     * HQL和sql不支持级联
     * @param depId
     * 1. xxxDAO.delete(id)
     * 2. 在主表的POJO上面@OneToMany(cascade=REMOVE或ALL)
     */
    public void delWithCasecade(int depId)
    {
        Dep dep = depDAO.findById(depId).get();
        depDAO.delete(dep);
    }
}
